<?php
require_once 'AdminController.php';
/**
 * 
 * Classe referente às fotos do site
 * @author Ramon Moraes
 *
 */
class Fotos extends AdminController{
	
	/**
	 * 
	 * Construtor da classe
	 * @access public
	 * @method __construct
	 */
	public function __construct(){
		
		parent::__construct();
	}
	
	/**
	 * Função padrão, carrega a view da controller genérica
	 * @see AdminController::index()
	 */
	public function index(){
		
		parent::index($this->router->fetch_class());
	}
	
	/**
	 * 
	 * Função para carregar página de cadastrar fotos
	 * @access public
	 * @method cadastro
	 */
	public function cadastro($idGaleria=null, $pag=1, $limit=10){
		
		if(!$this->isLogged()){
			redirect('admin/administradores/login');
		}
		
		if($idGaleria == null){
			redirect('admin/galerias');
		}
		
		$indices = array(
			'Id',
			'Thumb',
			'Descrição'
		);
		
		$gal = new Galeria();
		$gal->where('id', $idGaleria)->get();
		if($gal->id != null){
			$gal->foto->order_by('id', 'desc')->get($limit, ($pag - 1) * $limit);
			
			$dados = array();
			foreach($gal->foto->all as $f){
				$dados[] = $f->getArrayDadosAdmin();
			}
			
			$f2 = new Foto();
			$total = $f2->where('flag', 'ATIVO')->count();
			$numPaginas = ceil($total / $limit);
			if($numPaginas == 0){
				$numPaginas = 1;
			}
			
			$paginacao = array(
				'paginaAtual' 		=> $pag,
				'itensPorPagina'	=> $limit,
				'totalPaginas'		=> $numPaginas,
				'link'				=> 'admin/' . $this->router->fetch_class() . '/' . $this->router->fetch_method() . '/' . $idGaleria . '/'
			);
			
			$this->setData('colunas', $indices);
			$this->setData('linhas', $dados);
			$this->setData('idGaleria', $idGaleria);
			$this->setData('paginacao', $paginacao);
			
			$this->loadView('admin/fotos/index');
		}else{
			redirect('admin/galerias');
		}
	}
	
	/**
	 * 
	 * Função para exluir uma foto
	 * @param int $id
	 * @access public
	 * @method excluir
	 */
	public function excluir($id){
		$fot = new Foto();
		$fot->where('id', $id)->get();
		
		#Buscando a galeria correspondente para redirecionar para a página de fotos dela
		$fot->galeria->get();
		$idGaleria = $fot->galeria->id;
		
		if(unlink($_SERVER['DOCUMENT_ROOT'] . $fot->path))
			$fot->delete();
		redirect('admin/fotos/cadastro/' . $idGaleria);
	}
	
	/**
	 * 
	 * Função para salvar uma foto
	 * @param int $id
	 * @access public
	 * @method salvar
	 */
	public function salvar($id=null){
		
		$gal = new Galeria();
		$gal->where('id', $_POST['idGaleria'])->get();
		
		if(isset($_FILES['imagem']) && $_FILES['imagem']['error'] == 0){

			$fot = new Foto();
			
			if($id != null){
				$fot->where('id', $id)->get();
			}
			
			if(isset($_POST['descricao']) && $_POST['descricao'] != ''){
				$fot->descricao = $_POST['descricao'];
			}
			$fot->save();
			
			$dir = base_url() . 'uploads/' . $this->router->fetch_class() . '/' . $gal->id . '/';
			$file = md5($fot->id);
			$ext = explode(".", $_FILES['imagem']['name']);
			$ext = $ext[count($ext) - 1];
			$file .= '.' . $ext;
			
			if(!file_exists($_SERVER['DOCUMENT_ROOT'] . $dir)){
				mkdir($_SERVER['DOCUMENT_ROOT'] . $dir, 0777, true);
			}
			
			if($fot->saveResized($_FILES['imagem']['tmp_name'], $ext, ($_SERVER['DOCUMENT_ROOT'] . $dir . $file))){
				$fot->path = $dir . $file;
				$fot->save($gal);
			}else{
				$fot->delete();
				redirect('admin/fotos/cadastroErro/' . $gal->id);
			}
			
			redirect('admin/fotos/cadastroSucesso/' . $gal->id);
		}elseif(isset($_FILES['zip']) && $_FILES['zip']['error'] == 0){
			
			//pegando o caminho completo do arquivo zip
			$caminho = $_FILES['zip']['tmp_name'];
			//abrindo o arquivo zip
			$zip = zip_open($_FILES['zip']['tmp_name']);
			//lendo todo o conteudo do arquivo zip
			while(($elemento = zip_read($zip)) != false){
				
				//pegando o nome do arquivo/diretorio em questao
				$nome = zip_entry_name($elemento);
				//descartando os diretorios "." e ".."
				if($nome != '.' && $nome != '..'){
					
					//verificando o tamanho total do elemento
					if(zip_entry_filesize($elemento)){

						$fot = new Foto();
						$fot->descricao = '';
						$fot->save();
						
						$dir = base_url() . 'uploads/' . $this->router->fetch_class() . '/' . $gal->id . '/';
						$file = md5($fot->id);
						$ext = explode(".", $nome);
						$ext = $ext[count($ext) - 1];
						$file .= '.' . $ext;
							
						if(!file_exists($_SERVER['DOCUMENT_ROOT'] . $dir)){
							mkdir($_SERVER['DOCUMENT_ROOT'] . $dir, 0777, true);
						}
						
						//se possui tamanho, entao nao eh uma pasta, logo, devemos
						//criar um arquivo com o mesmo nome
						$arquivo = fopen(($_SERVER['DOCUMENT_ROOT'] . $dir . $file), 'wb');
						//escrevendo todo o conteudo do elemento para o arquivo que
						//acabamos de criar
						fwrite($arquivo, zip_entry_read($elemento, zip_entry_filesize($elemento)));
						//fechando o arquivo que criamos
						fclose($arquivo);
						
						$fot->saveResized(($_SERVER['DOCUMENT_ROOT'] . $dir . $file), $ext, ($_SERVER['DOCUMENT_ROOT'] . $dir . $file));
						
						$fot->path = $dir . $file;
						$fot->save($gal);
					}
				}
			}
			redirect('admin/fotos/cadastroSucesso/' . $gal->id);
		}elseif(isset($_POST['descricao']) && $_POST['descricao'] != '' && $id != null){
			$fot = new Foto();
			$fot->where('id', $id)->get();
			$fot->descricao = $_POST['descricao'];
			$fot->save();
			redirect('admin/fotos/cadastroSucesso/' . $gal->id);
		}
		redirect('admin/fotos/cadastroErro/' . $gal->id);
	}
	
	/**
	 * 
	 * Função para o caso de sucesso na inserção ou alteração de um registro
	 * @access public 
	 * @method cadastroSucesso
	 */
	public function cadastroSucesso($idGaleria){
		
		$this->setData('cadastroSucesso', true);
		$this->cadastro($idGaleria);
	}
	
	/**
	 * 
	 * Função para o caso de erro na inserção ou alteração de um registro
	 * @param String $erro
	 * @access public
	 * @method cadastroErro
	 */
	public function cadastroErro($idGaleria, $erro=null){
		
		$this->setData('cadastroSucesso', false);
		$this->cadastro($idGaleria);
	}
	
}